# -*- coding: utf-8 -*-
"""
#-------------------------------------------------------------------------------
# Nom:         importCalage
#
# Auteur:      Alain Gauthier
#
# Créé le:     16/08/2013
# Copyright:   (c) eaucéa 2014
# Licence:     GNU Public Licence (GPL)

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

Import des données de calage:
    - Charge la liste de stations de mesure depuis un fichier CSV

Ce script doit être lancé depuis l'interface du plugin 'ModelePluieDebit' sous QGIS

#-------------------------------------------------------------------------------
"""

# modules système
import csv

# constantes
__NB_CHAMPS_CALAGE__ = 11
__NB_XGR__ = 4
__PREFIXE_COMMENTAIRE__ = '#'

#------------------------------------------------------------------------------#

def chargerStations(aNomFichier):
    """
    Lit les données de aNomFichier et construit un dictionnaire contenant les données
    de calage pour chaque station
    """
    resultat = dict()
    fid = open (aNomFichier, 'r')
    try:
        # format lu
        formatcsv = csv.Sniffer().sniff(fid.read(5))
        fid.seek(0)
        # structure csv
        reader = csv.reader (fid, delimiter=';')

        # champs du fichier lu
        champs = next(reader)

        # analyse des champs
        if not controleChampsOK(champs):
            raise BufferError('Problème avec les champs du fichier : contrôler leur nombre')
        # lecture des données
        for row in reader:
            id_station,donnees_calage = traiterLigne(row)
            # stations à ignorer : nom commençant par #
            if donnees_calage['nom_station'].find(__PREFIXE_COMMENTAIRE__)==0:
                continue
            # résultat pour la ligne lue
            resultat[id_station] = donnees_calage
    finally:
        # fermeture fichier
        fid.close()
        return resultat

#------------------------------------------------------------------------------#

def controleChampsOK(Achamps):
    """
    Renvoie False si le contrôle des champs n'est pas correct.
    Contrôle uniquement le nombre de champs du fichier.
    """
    Result = (len(Achamps)==__NB_CHAMPS_CALAGE__)
    return Result

#------------------------------------------------------------------------------#

def traiterLigne(aLigne):
    """
    Analyse et renvoie les données associée au contenu de aLigne lue dans le fichier
    """
    indice = 0
    # nom de la station
    nom_station = aLigne[indice]

    indice = indice+1
    # identifiant de station (sans la cote éventuelle en préfixe)
    id_station = aLigne[indice]
    id_station = id_station.split("'")[-1]

    indice = indice + 1
    # identifiant de BV
    id_BV = aLigne[indice]

    indice = indice + 1
    # aire du bassin versant
    aireBV = aLigne[indice]

    indice = indice + 1
    # paramètres initiaux de GR4J
    Xparam = aLigne[indice:indice+__NB_XGR__]

    indice = indice+__NB_XGR__
    # durée d'évaluation du calage : contient les dates de départ et de fin
    dureeCalage = aLigne[indice:indice+2]

    indice = indice+2
    # pente du bassin versant
    pente = aLigne[indice]

    # données de la station
    donnees_calage = dict()
    donnees_calage['nom_station'] = nom_station
    donnees_calage['id_BV'] = id_BV
    donnees_calage['aire'] = aireBV
    donnees_calage['Xparam'] = Xparam
    donnees_calage['duree_eval'] = dureeCalage
    donnees_calage['pente'] = pente
    # résultat renvoyé
    return id_station,donnees_calage
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#


if __name__ == '__main__':
    raise EnvironmentError("module devant être exécuté sous console/extension python QGIS")
